package cn.modoumama.common.tools;

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Date;
import java.util.Properties;

    
public class SendMail {
	private static MyAuthenticator myAuthenticator = null;
	private static Properties props = null;

	/**
	 * 初始化邮箱发送需要的数据
	 *
	 * @param emailName   发件人的名称
	 * @param emailSMTPHost  发件人邮箱的 SMTP 服务器地址  一般(只是一般, 绝非绝对)格式为: smtp.xxx.com, 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
	 * @param emailAccount  发件人的账户
	 * @param emailPassword 发件人的密码
	 * @return: void
	 * 创建人: 邓强
	 * 创建时间: 2018-05-07 14:16
	 */
	public static void initialization(String emailName, String emailSMTPHost, String emailAccount, String emailPassword){

		myAuthenticator = new MyAuthenticator(emailName, emailAccount, emailPassword);

		// 创建参数配置, 用于连接邮件服务器的参数配置
		props = new Properties();                    // 参数配置
		props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议（JavaMail规范要求）
		props.setProperty("mail.smtp.host", emailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
		props.setProperty("mail.smtp.auth", "true");            // 需要请求认证

		// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
		//     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
		//     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
        /*
        // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
        //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
        //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
        final String smtpPort = "465";
        props.setProperty("mail.smtp.port", smtpPort);
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", smtpPort);
        */
	}

	/**
	 * 以Multipart格式发送邮件
	 */
	public static Message getMessage (Address[] recipients , String subject) throws Exception {
		isInitialization();
		Session session = Session.getInstance(props,myAuthenticator);
		// 根据session创建一个邮件消息
		Message mailMessage = new MimeMessage(session);
		// 设置邮件消息的发送者
		mailMessage.setFrom(myAuthenticator.getAddress());
		// Message.RecipientType.TO属性表示接收者的类型为TO
		mailMessage.setRecipients(Message.RecipientType.TO, recipients);
		// 设置邮件消息的主题
		mailMessage.setSubject(subject);
		// 设置邮件消息发送的时间
		mailMessage.setSentDate(new Date());
		return mailMessage;
	}

	/**
	 * 以Multipart格式发送邮件
	 */
	public static boolean sendMail(Address[] recipients , String subject, Multipart content) throws Exception {
		Message mailMessage =getMessage(recipients,subject);
		try {
			// 设置邮件消息的主要内容
			mailMessage.setContent(content);
			// 发送邮件
			Transport.send(mailMessage);
			return true;
		} catch (MessagingException ex) {
			ex.printStackTrace();
		}
		return false;
	}

	/**
	 * 以文本格式发送邮件
	 */
	public static boolean sendMail(Address[] recipients , String subject, String content) throws Exception {
		Message mailMessage =getMessage(recipients,subject);
		try {
			// 设置邮件消息的主要内容
			mailMessage.setText(content);
			// 发送邮件
			Transport.send(mailMessage);
			return true;
		} catch (MessagingException ex) {
			ex.printStackTrace();
		}
		return false;
	}

	public static boolean sendMail(String[] recipients , String subject, String content) throws Exception {
		// 创建邮件的接收者地址，并设置到邮件消息中
		InternetAddress[] address = new InternetAddress[recipients.length];
		for(int   i=0;i <address.length;i++){
			try {
				address[i]=new   InternetAddress(recipients[i]);
			} catch (AddressException e) {
				e.printStackTrace();
			}
		}
		return sendMail(address,subject,content);
	}

	public static boolean sendMail(String[] recipients , String subject, Multipart content) throws Exception {
		// 创建邮件的接收者地址，并设置到邮件消息中
		InternetAddress[] address = new InternetAddress[recipients.length];
		for(int   i=0;i <address.length;i++){
			try {
				address[i]=new   InternetAddress(recipients[i]);
			} catch (AddressException e) {
				e.printStackTrace();
			}
		}
		return sendMail(address,subject,content);
	}

	public static boolean sendTextMail(String[] recipients , String subject, String content) throws Exception {
		return sendMail(recipients, subject, content);
	}

	public static boolean sendTextMail(String recipient , String subject, String content) throws Exception {
		return sendTextMail(new String[]{recipient},subject,content);
	}

	public static boolean sendHtmlMail(String[] recipients , String subject, String content) throws Exception {
		// MiniMultipart类是一个容器类，包含MimeBodyPart类型的对象
		Multipart mainPart = new MimeMultipart();
		// 创建一个包含HTML内容的MimeBodyPart
		BodyPart html = new MimeBodyPart();
		// 设置HTML内容
		try {
			html.setContent(content, "text/html; charset=utf-8");
			mainPart.addBodyPart(html);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
		return sendMail(recipients, subject, content);
	}

	public static boolean sendHtmlMail(String recipient , String subject, String content) throws Exception {
		return sendHtmlMail(new String[]{recipient},subject,content);
	}

	private static void isInitialization() throws Exception {
		if (myAuthenticator == null) {
			throw new Exception("没有初始化邮件客户端，先执行initialization方法");
		}
	}
}